﻿#region Using

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

#endregion

namespace Vk.Methods.Stats
{
    /// <summary>
    ///     Статистика
    /// </summary>
    public class Stats
    {
        private readonly Api _api;

        public Stats(Api api)
        {
            _api = api;
        }

        /// <summary>
        ///     Возвращает статистику группы или приложения.
        /// </summary>
        /// <param name="groupId">ID группы, статистику которой необходимо получить.</param>
        /// <param name="appId">ID приложения, статистику которой необходимо получить.</param>
        /// <param name="dateFrom">Начальная дата выводимой статистики в формате YYYY-MM-DD, пример: 2011-09-27 - 27 сентября 2011</param>
        /// <param name="dateTo">Конечная дата выводимой статистики в формате YYYY-MM-DD, пример: 2011-09-27 - 27 сентября 2011</param>
        /// <returns>Статистика по дням</returns>
        public async Task<List<Period>> Get(int? groupId, int? appId, DateTime dateFrom, DateTime dateTo)
        {
            if (dateFrom == null)
            {
                throw new ArgumentNullException(nameof(dateFrom));
            }
            if (dateTo == null)
            {
                throw new ArgumentNullException(nameof(dateTo));
            }

            if (groupId != null && appId != null)
            {
                throw new Exception("Невозможно использовать метод одновременно и с groupId и с appId");
            }
            if (groupId == null && appId == null)
            {
                throw new ArgumentNullException("Один параметр должен быть указан: groupId или appId", innerException: null);
            }

            var query = new ApiQuery("stats.get")
                .Add("group_id", groupId)
                .Add("app_id", appId)
                .Add("date_from", dateFrom.ToString("yyyy-MM-dd"))
                .Add("date_to", dateTo.ToString("yyyy-MM-dd"));

            var result = await _api.Manager.Execute(query);
            if (_api.Manager.MethodSuccessed)
            {
                var nodes = result.SelectNodes("period");
                return nodes.Select(node => new Period(node)).ToList();
            }
            return null;
        }
    }
}